package com.rengwuxian.coursecoroutines._4_flow

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.channels.produce
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.coroutines.EmptyCoroutineContext

/**
 * actor()：把 SendChannel 暴露处理
 * actor()、produce()
 *
 * produce()是Channel的创建和发送结合在一起。
 *   scope.produce {
 *     for (num in 1..100) {
 *       send(num)
 *       delay(1000)
 *     }
 *   }
 *
 * actor()是Channel的创建和接收结合在一起。（接收数据，因为不知道处理数据的类型，需要做类型声明）
 *   val sender = scope.actor<Int> {
 *     for (num in this) {
 *       println("Number: $num")
 *     }
 *   }
 *   // 发送数据
 *   scope.launch {
 *     for (num in 1..100) {
 *       sender.send(num)
 *       delay(1000)
 *     }
 *   }
 * 存在ObsoleteCoroutinesApi的注解，有设计缺陷，将来可能会重新设计。但是功能和性能都是没有问题的。
 */
@OptIn(ObsoleteCoroutinesApi::class)
fun main() = runBlocking<Unit> {
  val scope = CoroutineScope(EmptyCoroutineContext)
  val sender = scope.actor<Int> {
    for (num in this) {
      println("Number: $num")
    }
  }
  scope.launch {
    for (num in 1..100) {
      sender.send(num)
      delay(1000)
    }
  }

  scope.produce {
    for (num in 1..100) {
      send(num)
      delay(1000)
    }
  }
  delay(10000)
}